// Rubrica.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <string.h>
#define NR 10 // Numero di nomi
#define NC 12 // Lunghezza massima nomi
#define SPAZIOEXTRA 5 // Numero di nomi extra che è possibile inserire
#define LEN 3 // Lunghezza nomi random
using namespace std;

void menu();
// void resettavar(char matrice[][NC], char iniziale, bool allocato);
void inserisci(char matrice[][NC]);
void ricerca_nome(char matrice[][NC], char nome[], bool allocato);
void ricerca_iniziale(char matrice[][NC], char iniziale, bool allocato);
void aggiungi(char matrice[][NC], bool allocato);
void visualizza(char matrice[][NC], bool allocato);

int main()
{
	srand(time(NULL));
	menu();
	system("pause");
    return 0;
}

void menu()
{
	int scelta; // Classico
	bool allocato=false; // Per controllare se bisogna controllare i valori tra NR e SPAZIOEXTRA (da 10 a 15) 
	char nome[NC]; // Serve per cercare per nome, NC è il numero di caratteri massimi del nome
	char iniziale='x'; // Serve per cercare per iniziale e va inizializzato a qualcosa
	char rubrica[NR+SPAZIOEXTRA][NC]; // Le righe della rubrica sono (numero righe + spazio extra) mentre le colonne sono la lunghezza massima di ogni stringa
	// resettavar(rubrica, iniziale, allocato);
	do
	{
		system("cls");
		printf("0. Esci\n");
		printf("1. Inserisci\n");
		printf("2. Cerca per nome\n");
		printf("3. Cerca per iniziale\n");
		printf("4. Stampa\n");
		printf("5. Aggiungi\n");
		cin >> scelta;
		switch (scelta)
		{
		case 1:
			inserisci(rubrica);
			system("pause");
			break;
		case 2:
			ricerca_nome(rubrica, nome, allocato);
			system("pause");
			break;
		case 3:
			ricerca_iniziale(rubrica, iniziale, allocato);
			system("pause");
			break;
		case 4:
			visualizza(rubrica, allocato);
			system("pause");
			break;
		case 5:
			aggiungi(rubrica, allocato);
			allocato = true; // Se non lo impostiamo rimane false e dobbiamo impostarlo nel menù e non in una funzione
			system("pause");
			break;
		}
	}while(scelta!=0);
}

/*
void resettavar(char matrice[][NC], char iniziale, bool allocato)
{
	for (int j = 0; j < NR+SPAZIOEXTRA; j++)
	{
		for (int i = 0; i < NC; i++)
		{
			matrice[j][i] = '_'; //A caso
		}
		matrice[j][LEN] = '\0'; //Terminatore
	}
	allocato = false;
	iniziale = 'a';
}
*/

void inserisci(char matrice[][NC])
{
	for (int j = 0; j < NR; j++)
	{
		for (int i = 0; i < LEN; i++) // LEN = Lunghezza delle stringhe random
		{
			matrice[j][i] = 65 + rand() % 25; // 65 = A, 90=Z, dunque il minimo è 65 e il numero massimo è (90-65) che è 25
		}
		matrice[j][LEN] = '\0'; //Dobbiamo mettergli manualmente il terminatore a matrice[j][LEN] dove LEN è la lunghezza delle stringhe random
	}
	// clog << "Inserisci stringa\n";
	// visualizza(matrice, allocato);
}

void ricerca_nome(char matrice[][NC], char nome[], bool allocato)
{
	printf("Inserisci il nome da cercare\n");
	cin >> nome;
	for (int j = 0; j < NR+SPAZIOEXTRA; j++) // Il ciclo deve andare da 0 a 15
	{
		if ((j >= NR) && (allocato == false)) // Se j>=10 e allocato è falso, esci dal ciclo (in modo che non vada a controllare lo spazioextra se non inizializzato)
			break;
		if ((strcmp(matrice[j], nome)) == 0) //Se matrice[j] e nome sono uguali
		{
			printf("Trovato alla posizione %d\n", j);
		}
	}
	// clog << "Ricercato nome\n";
}

void ricerca_iniziale(char matrice[][NC], char iniziale, bool allocato)
{
	printf("Inserisci l'iniziale\n");
	cin >> iniziale;
	for (int j = 0; j < NR+SPAZIOEXTRA; j++)
	{
		if ((j >= NR) && (allocato == false))
			break;
		if (matrice[j][0] == iniziale)
			printf("Trovato %s alla posizione %d\n", matrice[j], j);
	}
	// clog << "Ricercato iniziale\n";
}

void visualizza(char matrice[][NC], bool allocato)
{
	// printf("%d\n", allocato);
	for (int j = 0; j < (NR+SPAZIOEXTRA); j++)
	{
		printf("%d: %s\n", j, matrice[j]); //Posizione: stringa
		if ((j >= NR - 1) && (allocato != true)) // Non so perchè ma se funziona meglio non farci domande
			break;
		else // Forse l'else è inutile ma dettagli
			continue; // Idem sopra
	}
	printf("\n");
	// clog << "Visualizzato\n";
}

void aggiungi(char matrice[][NC], bool allocato)
{
	for (int j = 0; j < SPAZIOEXTRA; j++) // J vale da 0 a SPAZIOEXTRA dunque da 0 a 4 (5 valori)
	{
		cin >> matrice[j+NR]; // NR vale 10, e la funzione inserisci inizializza la matrice fino a 9, dunque dobbiamo sommare NR a j, che per la prima volta è 0 dunque NC+j=10, poi 11, 12 etc.
	}
	// clog << "Aggiunto\n";
}